package com.gsdl.model.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

// TODO: Auto-generated Javadoc
/**
 * The Class Pedido.
 *
 * @author Natacha Antonopoulos
 */

@Entity
@Table(name = "pedido")
@NamedQueries( 
	    {   
	        @NamedQuery(name = "Pedido.findByCentro", query = "SELECT p FROM Pedido p WHERE p.centro.id = :centroId"),
	        @NamedQuery(name = "Pedido.findByEstado", query = "SELECT p FROM Pedido p WHERE p.estadoPedido = :estado"),
	        @NamedQuery(name = "Pedido.findByCentroAndEstado", query = "SELECT p FROM Pedido p WHERE p.estadoPedido = :estado AND p.centro.id = :centroId")
	    }
	 )
public class Pedido extends BaseEntity implements Serializable{
	
	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = -768197393258104863L;
	
	/** The tipo pedido. */
	@ManyToOne
	@JoinColumn(name = "id_tipo_pedido", referencedColumnName = "id", nullable=false)
	private TipoPedido tipoPedido = new TipoPedido();
	
	/** The estado pedido. */
	@Column(name="estado_pedido", nullable=false)
	@Enumerated(EnumType.STRING)
	private EstadoPedido estadoPedido = EstadoPedido.PENDENTE;
	
	/** The descricao. */
	@Column(name="descricao")
	private String descricao;

	/** The centro. */
	@ManyToOne
	@JoinColumn(name = "id_centro", referencedColumnName = "id", nullable=false)
	private Centro centro = new Centro();
	
	/** The deposito expedicao. */
	@ManyToOne
	@JoinColumn(name = "id_deposito_expedicao", referencedColumnName = "id")
	private Deposito depositoExpedicao = new Deposito();
	
	/** The utilizador. */
	@ManyToOne
	@JoinColumn(name = "id_utilizador", referencedColumnName = "id", nullable=false)
	private Utilizador utilizador;
	
	/** The data pedido. */
	@Column(name="data_pedido", nullable=false)
	private Date dataPedido = new Date();
	
	/** The data expedicao. */
	@Column(name="data_expedicao")
	private Date dataExpedicao;
	
	/** The movimentos. */
	@OneToMany(mappedBy = "pedido",cascade=CascadeType.DETACH, fetch = FetchType.EAGER)
	private List<Movimento> movimentos = new ArrayList<Movimento>();

	/**
	 * The Enum EstadoPedido.
	 */
	public enum EstadoPedido {
		
		/** The pendente. */
		PENDENTE,
		
		/** The expedido. */
		EXPEDIDO,
		
		/** The anulado. */
		ANULADO;
	}
	
	/**
	 * Gets the tipo pedido.
	 *
	 * @return the tipoPedido
	 */
	public TipoPedido getTipoPedido() {
		return tipoPedido;
	}

	/**
	 * Sets the tipo pedido.
	 *
	 * @param tipoPedido the tipoPedido to set
	 */
	public void setTipoPedido(TipoPedido tipoPedido) {
		this.tipoPedido = tipoPedido;
	}

	/**
	 * Gets the estado pedido.
	 *
	 * @return the estadoPedido
	 */
	public EstadoPedido getEstadoPedido() {
		return estadoPedido;
	}

	/**
	 * Sets the estado pedido.
	 *
	 * @param estadoPedido the estadoPedido to set
	 */
	public void setEstadoPedido(EstadoPedido estadoPedido) {
		this.estadoPedido = estadoPedido;
	}

	/**
	 * Gets the descricao.
	 *
	 * @return the descricao
	 */
	public String getDescricao() {
		return descricao;
	}

	/**
	 * Sets the descricao.
	 *
	 * @param descricao the descricao to set
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	/**
	 * Gets the centro.
	 *
	 * @return the centro
	 */
	public Centro getCentro() {
		return centro;
	}

	/**
	 * Sets the centro.
	 *
	 * @param centro the centro to set
	 */
	public void setCentro(Centro centro) {
		this.centro = centro;
	}

	/**
	 * Gets the deposito expedicao.
	 *
	 * @return the depositoExpedicao
	 */
	public Deposito getDepositoExpedicao() {
		return depositoExpedicao;
	}

	/**
	 * Sets the deposito expedicao.
	 *
	 * @param depositoExpedicao the depositoExpedicao to set
	 */
	public void setDepositoExpedicao(Deposito depositoExpedicao) {
		this.depositoExpedicao = depositoExpedicao;
	}

	/**
	 * Gets the utilizador.
	 *
	 * @return the utilizador
	 */
	public Utilizador getUtilizador() {
		return utilizador;
	}

	/**
	 * Sets the utilizador.
	 *
	 * @param utilizador the utilizador to set
	 */
	public void setUtilizador(Utilizador utilizador) {
		this.utilizador = utilizador;
	}

	/**
	 * Gets the data pedido.
	 *
	 * @return the dataPedido
	 */
	public Date getDataPedido() {
		return dataPedido;
	}

	/**
	 * Sets the data pedido.
	 *
	 * @param dataPedido the dataPedido to set
	 */
	public void setDataPedido(Date dataPedido) {
		this.dataPedido = dataPedido;
	}

	/**
	 * Gets the data expedicao.
	 *
	 * @return the dataExpedicao
	 */
	public Date getDataExpedicao() {
		return dataExpedicao;
	}

	/**
	 * Sets the data expedicao.
	 *
	 * @param dataExpedicao the dataExpedicao to set
	 */
	public void setDataExpedicao(Date dataExpedicao) {
		this.dataExpedicao = dataExpedicao;
	}

	/**
	 * Gets the movimentos.
	 *
	 * @return the movimentos
	 */
	public List<Movimento> getMovimentos() {
		return movimentos;
	}

	/**
	 * Sets the movimentos.
	 *
	 * @param movimentos the movimentos to set
	 */
	public void setMovimentos(List<Movimento> movimentos) {
		this.movimentos = movimentos;
	}

}
